package com.qianya.system.face.aop;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.qianya.model.common.CommonResult;
import com.qianya.system.face.config.RedisUtil;
import com.qianya.util.annotation.ParamDict;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

/**
 * 把内容替换为param表里的内容
 * @author Lhl
 * @Date 2020年6月15日 上午11:51:53
 */
@Aspect
@Component
@Slf4j
public class ParamDictAspect {
    private static int paramCount=0;
    // 定义切点Pointcut
    @Pointcut("execution(public * com.qianya.system.face.web..*.*Impl.*(..))")
    public void excudeService() {
    }

    @Around("excudeService()")
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    	long time1=System.currentTimeMillis();	
        Object result = pjp.proceed();
        long time2=System.currentTimeMillis();
        log.debug("获取JSON数据 耗时："+(time2-time1)+"ms");
        long start=System.currentTimeMillis();
        this.parseDictText(result);
        long end=System.currentTimeMillis();
        log.debug("解析注入JSON数据  耗时"+(end-start)+"ms");
        return result;
    }

    /**
     * @Desc 转换数据
     * @param result
     * @author Lhl
     * @param <T>
	 * @Date 2020年6月15日 上午11:51:53
     */
    public <T> void parseDictText(Object result) {
    	/*if(result instanceof CommonResult<IPage<Object>> ) {
    		List<Object> list = new ArrayList<>();
    		for (Object object : ((PageUtils) result).getBean()) {
				list.add(changeEnityData(object));
			}
    		((PageUtils) result).setData(list);
    	}else */
    	if (result instanceof CommonResult){
    		if(((CommonResult) result).getBean() instanceof IPage){
				IPage iPage = (IPage)((CommonResult) result).getBean();
				List list=iPage.getRecords();
				for (int i = 0; i <list.size() ; i++) {
					if (i>0 && paramCount==0){
						break ;
					}
					changeEnityData(list.get(i));
				}
				iPage.setRecords(list);
			}else if (((CommonResult) result).getBean() instanceof ArrayList){
    			ArrayList list=(ArrayList) ((CommonResult) result).getBean();
				for (int i = 0; i <list.size() ; i++) {
					if (i>0 && paramCount==0){
						 break ;
					}
					changeEnityData(list.get(i));
				}
			}else if (((CommonResult) result).getBean() instanceof Object){
				changeEnityData(((CommonResult) result).getBean());
			}
		}
    }
    
    /**
     * @Desc 转换数据
     * @param object
     * @return
     * @author Lhl
	 * @Date 2020年6月15日 上午11:51:53
     */
    private Object changeEnityData(Object object) {
		for (Field field : object.getClass().getDeclaredFields()) {
			if(field.getAnnotation(ParamDict.class)!=null) {
				paramCount++;
				try {
					String dicValue = field.getAnnotation(ParamDict.class).value();
					//String dicTable = field.getAnnotation(ParamDict.class).dictTable();
					String value = (String) getResult(field.getName(), object);
					if(StringUtils.isNotEmpty(value)) {
						getSetMethod(object, field.getName()).invoke(object, value+","+getValue(dicValue,value));
					}
				} catch (IllegalAccessException e) {
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					e.printStackTrace();
				}
			}
		}
		return object;
    }
    
    /**
     * @Desc 获取原来的值
     * @param fieldName
     * @param object
     * @return
     * @author Lhl
     * @Date 2020年6月7日 上午11:51:38
     */
    private Object getResult(String fieldName, Object object){
        try {
        	return BeanUtils.getPropertyDescriptor(object.getClass(), fieldName).getReadMethod().invoke(object);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } 
        return null;
    }
    
    /**
     * @Desc 获取修改之后的值
     * @param value
     * @return
     * @author Lhl
     * @Date 2020年6月15日 上午11:51:53
     */
    private String getValue(String name,String value) {
		String key = name+value;
		Object obj= RedisUtil.hget("paramDictMap",key);
    	if(obj==null) { //没找到就去查数据库，然后放到map里去
			/*Map<String,Object> map=new HashMap<String,Object>();
    		SysParam param = paramService.getById(value);
    	 	map.put(name+value, param.getPaName());
			RedisUtil.hset("paramDictMap",map);*/
			return "不存在";
    	}
    	return obj.toString();
    }
    /**
     * @Desc 获取set方法
     * @param object
     * @param fieldName
     * @return
     * @author Lhl
	 * @Date 2020年6月15日 上午11:51:53
     */
    private Method getSetMethod(Object object,String fieldName) {
    	return BeanUtils.getPropertyDescriptor(object.getClass(), fieldName).getWriteMethod();
    }

}
